package jp.seraph.jspf.pose;

import java.util.Collection;
import java.util.Map;

import jp.seraph.jsade.math.Angle;
import jp.seraph.jsade.model.JointIdentifier;

/**
 * エージェントのポーズを表すインターフェース ポーズはJointのIDとそのJointの角度の組であらわされる。
 *
 */
public interface Pose extends Iterable<Map.Entry<JointIdentifier, Angle>> {
    /**
     * このポーズにおける対象ジョイントの目標角度を得る。
     *
     * @param aIdentifier
     * @return 対象ジョイントの角度。 nullである場合、そのジョイントの角度は不定
     */
    public Angle getJointAngle(JointIdentifier aIdentifier);

    /**
     * 引数に与えられたジョイントのみを残した、新しいPoseを生成して返す。
     *
     * @param aIdentifiers 残すジョイントの列
     * @return　新しいPose
     */
    public Pose filter(Collection<JointIdentifier> aIdentifiers);

    /**
     * 引数に与えられたジョイントのみを残した、新しいPoseを生成して返す。
     *
     * @param aIdentifiers 残すジョイントの列
     * @return　新しいPose
     */
    public Pose filter(JointIdentifier... aIdentifiers);

    /**
     * このポーズが保持するjointIdentifierの列を列挙するイテレータを生成してかえす。
     *
     * @return
     */
    public Collection<JointIdentifier> jointCollection();
}
